/**
 * 
 */
package br.com.framework.app.model;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.Size;

import br.com.framework.persistencia.model.AuditedEntity;

/**
 * @author Cleber
 * 
 */
@Entity
@Table(name = "LIVRO")
public class Livro extends AuditedEntity {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private String titulo;
	private String isbn;
	private Set<Autor> autores;

	/**
	 * 
	 */
	public Livro() {
	}
	
	@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_LIVRO")
	@SequenceGenerator(name="SEQ_LIVRO", sequenceName="SEQ_LIVRO", allocationSize=1, initialValue=0)
	@Column(name = "ID_LIVRO")
	public Long getId() {
		return super.getId();
	}

	/**
	 * @return the titulo
	 */
	@Column(name = "TITULO", length = 255, nullable = false)
	@Size(min = 1, max = 255, message = "{livro.titulo.tamanhoInvalido}")
	public String getTitulo() {
		return titulo;
	}

	/**
	 * @param titulo
	 *            the titulo to set
	 */
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	/**
	 * @return the isbn
	 */
	@Column(name = "ISBN", length = 11, nullable = false)
	@Size(min = 10, max = 13, message = "{livro.isbn.tamanhoInvalido}")
	public String getIsbn() {
		return isbn;
	}

	/**
	 * @param isbn
	 *            the senha to set
	 */
	public void setIsbn(String cpf) {
		this.isbn = cpf;
	}

	/**
	 * @return the autores
	 */
	@ManyToMany(targetEntity=Autor.class, cascade = {CascadeType.ALL})
	@JoinTable(name = "AUTOR_LIVRO", 
		joinColumns = @JoinColumn(name = "ID_LIVRO", referencedColumnName = "ID_LIVRO"), 
		inverseJoinColumns = @JoinColumn(name = "ID_AUTOR", referencedColumnName = "ID_AUTOR"))
	@Size(min = 1, message = "{livro.autores.tamanhoInvalido}")
	public Set<Autor> getAutores() {
		return autores;
	}

	/**
	 * @param autores
	 *            the autores to set
	 */
	public void setAutores(Set<Autor> autores) {
		this.autores = autores;
	}

}
